19.12 Registerkarten mit »TabControl«  
19.12.1 Die Klasse »TabControl«  
Registerkarten helfen, einen Dialog besser und übersichtlicher zu gliedern und Funktionalitäten zu gruppieren. Typischerweise werden Registerkarten gerne in den Dialogfeldern Optionen benutzt, wie in Abbildung 19.14 sehen ist.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 19.14 Dialog mit Registerkarten
Eine einzelne Registerkarte wird durch den Typ TabPage beschrieben. Alle Registerkarten einer Form bilden einen logischen Verbund und werden, was kaum verwundern dürfte, von einer Auflistung verwaltet. Diese wird vom Steuerelement TabControl bereitgestellt. TabControl kommt aber nicht nur eine Verwaltungsaufgabe zu, es dient im Formular auch als Container aller darin enthaltenen Registerkarten.
Die Auflistung »TabControl.TabPageCollection«
Über die Eigenschaft TabPages des TabControl-Objekts können Sie der Auflistung die erforderlichen Registerkarten hinzufügen. Dazu markieren Sie diese Eigenschaft im Eigenschaftsfenster und klicken auf die Schaltfläche in der Wertespalte. Es öffnet sich daraufhin ein Dialog, über dessen Schaltfläche Hinzufügen eine neue Registerkarte angelegt wird (siehe Abbildung 19.15). Im gleichen Dialog können auch die Eigenschaften der neuen Registerkarte eingetragen werden.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 19.15 Der Dialog zum Hinzufügen einer Registerkarte
Wir wollen uns jetzt ansehen, wie wir dasselbe auch mittels Programmcode realisieren können. Die Eigenschaft TabPages liefert die Referenz auf die Auflistung zurück, die darauf spezialisiert ist, TabPage-Objekte zu verwalten.
| Public ReadOnly Property TabPages As TabControl.TabPageCollection
|
Die Auflistung TabControl.TabPageCollection ist eine innere Auflistung der Klasse TabControl und veröffentlicht Methoden, die uns schon bei anderen Auflistungen begegnet sind, beispielsweise Add, IndexOf, Remove, RemoveAt usw.
Um das Objekt einer Registerkarte per Code zur Auflistung hinzuzufügen, müssen wir die folgenden Anweisungen codieren:
| Dim tabControl1 As New TabControl
|
| tabControl1.Controls.Add(tabPage1)
|
Dabei sei angenommen, dass tabPage1 die Referenz auf eine Instanz von TabPage ist.
Die Eigenschaften eines »TabControl«-Objekts
Die optische Darstellung der Registerkarten kann mit der Eigenschaft Appearance des Registerkarten-Steuerelements festgelegt werden.
| Public Property Appearance As TabAppearance
|
Zur Auswahl stehen drei Optionen: Normal, Buttons und FlatButtons. Die in Abbildung 19.16 dargestellte Form weist drei TabControl-Objekte mit jeweils vier Registerkarten auf. Jedes Objekt hat dabei eine andere Appearance-Einstellung.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 19.16 Darstellungsformen der Registerkarten
Standardmäßig werden alle Registerkarten am oberen Rand des Steuerelements angezeigt. Mit Alignment können Sie die Tabellenreiter aber auch rechts, links oder unten anordnen.
| Public Property Alignment As TabAlignment
|
Der Typ TabAlignment ist eine Enumeration, deren Mitglieder Sie der Tabelle 19.10 entnehmen können.
Tabelle 19.10 Konstanten der Enumeration »TabAlignment«
| Member
|
Beschreibung
|
| Bottom
|
Die Registerkarten werden am unteren Rand des Steuerelements angezeigt.
|
| Left
|
Die Registerkarten werden am linken Rand des Steuerelements angezeigt.
|
| Right
|
Die Registerkarten werden am rechten Rand des Steuerelements angezeigt.
|
| Top
|
Die Registerkarten werden am oberen Rand des Steuerelements angezeigt.
|
Neben Appearance und TabAlignment bestimmt die Eigenschaft MultiLine ganz entscheidend das Erscheinungsbild. Standardmäßig werden alle Karteireiter in einer Zeile angezeigt – selbst dann, wenn die Breite des Registerkarten-Steuerelements nicht mehr für alle Karteireiter ausreicht. Um durch alle Registerkarten navigieren zu können, werden dann zwei Pfeilschalter eingeblendet. Können Sie sich mit dieser Darstellungsweise nicht anfreunden, haben Sie auch die Möglichkeit, mit der Einstellung MultiLine=True die Registerkarten auf mehrere Zeilen aufzuteilen. Die Aufteilung erfolgt dann, falls notwendig, automatisch.
Eine Eigenschaft, um die Anzahl der Zeilen festzulegen, hat das TabControl-Steuerelement nicht. Wenn Sie sich die Dokumentation zu diesem Steuerelement ansehen, werden Sie zwar auf eine Eigenschaft RowCount stoßen, diese ist allerdings schreibgeschützt, liefert demnach nur die Anzahl der Registerkartenzeilen.
SizeMode gibt an, wie die Größe der einzelnen Karteireiter bestimmt wird:
| Public Property SizeMode As TabSizeMode
|
Die möglichen Einstellungen können Sie der Tabelle 19.11 entnehmen.
Tabelle 19.11 Die Enumeration »TabSizeMode«
| Member
|
Beschreibung
|
| Normal
|
Alle Karteireiter sind so breit, dass der angezeigte Text darin Platz findet.
|
| Fixed
|
Alle Karteireiter haben dieselbe Breite. Dabei wird die Breite mit der Eigenschaft ItemSize des TabControl-Steuerelements festgelegt.
|
| FillToRight
|
Falls die Reiter über mehrere Zeilen verteilt sind, wird die Breite der einzelnen Reiter so festgelegt, dass die ganze Karteireiterzeile ausgefüllt wird.
|
Der Abstand zwischen der Beschriftung und dem Rand des Karteireiters kann mit der Eigenschaft Padding beeinflusst werden:
| Public Property Padding As Point
|
Die Einstellung Padding.X legt dabei den Abstand zum linken und rechten Rand des Karteireiters in Pixel fest, Padding.Y den Abstand zum oberen und unteren Rand.
Jeder Karteireiter kann neben der Schrift auch noch ein optisch ansprechendes Bildchen anzeigen. Voraussetzung dafür ist, dass in der Eigenschaft ImageList des TabControl-Objekts ein ImageList-Steuerelement eingetragen ist, das Sie vorher der Form hinzugefügt haben. Als Vorbereitung ist das vollkommen ausreichend, denn die Zuordnung eines Bildchens zu einer bestimmten Registerkarte wird im TabPage-Objekt vorgenommen.
Die Aktivierung einer anderen Registerkarte
Um aus der aktuellen Registerkarte heraus mittels Programmcode eine andere zu aktivieren, stellt die Klasse TabControl zwei Eigenschaften zur Verfügung: SelectedIndex und SelectedTab.
| Public Property SelectedIndex As Integer
|
| Public Property SelectedTab As TabPage
|
Vorausgesetzt, dass tabControl1 der Name des TabControl-Objekts ist, das mindestens drei Registerkarten enthält, können Sie mit
| tabControl1.SelectedIndex = 2
|
die dritte Registerkarte öffnen.
Im .NET Framework wurde TabControl um zwei Methoden ergänzt, die ebenfalls die Aktivierung einer anderen Registerkarte bewirken.
| Public Sub SelectTab(Integer)
|
Sie können dieser Methode den Index, den Namen oder die Referenz der Registerkarte übergeben, die aktiviert werden soll. Genauso überladen ist die neue Methode Deselect. Allerdings wird die der angegebenen Registerkarte folgende Registerkarte zur aktuellen.
| Public Sub DeselectTab(Integer)
|
Zusammenfassung der Eigenschaften von »TabControl«
Fassen wir jetzt die genannten spezifischen Eigenschaften eines TabControl-Objekts in übersichtlicher Form in einer Tabelle zusammen.
Tabelle 19.12 Eigenschaften eines »TabControl«-Objekts
| Eigenschaft
|
Beschreibung
|
| Alignment
|
Legt die Anordnung der Karteireiter hinsichtlich des TabControls fest oder ruft diese ab.
|
| Appearance
|
Ruft die visuelle Darstellung der Registerkarten des Steuerelements ab oder legt diese fest.
|
| ImageList
|
Ruft das ListImage-Steuerelement mit den auf den Registerkarten des Steuerelements anzuzeigenden Bildern ab oder legt diese fest.
|
| ItemSize
|
Ruft die Größe der Registerkarten des Steuerelements ab oder legt diese fest.
|
| MultiLine
|
Legt fest, ob die Karteireiter auf mehrere Zeilen aufgeteilt werden können.
|
| Padding
|
Legt den Abstand zwischen dem Beschriftungstext der Karteireiter und dem Rand des Karteireiters fest.
|
| RowCount
|
Ruft die Anzahl der Zeilen der Karteireiter ab.
|
| SelectedIndex
|
Legt den Index der neuen aktuellen Tabseite fest.
|
| SelectedTab
|
Legt die derzeit ausgewählte Tabseite fest.
|
| SizeMode
|
Legt fest, wie die Größe der Registerkarten des Steuerelements bestimmt wird.
|
| TabPages
|
Ruft die Auflistung der Tabseiten in diesem Registerkarten-Steuerelement ab.
|
Die Ereignisse des »TabControls«
Wenn sich die aktuelle Registerkarte in einem TabControl ändert, treten die folgenden Ereignisse in der angegebenen Reihenfolge ein:
|
Deselecting |
|
Deselected |
|
Selecting |
|
Selected |
Deselecting und Deselected werden vor bzw. nach der Deaktivierung einer Registerkarte ausgelöst, Selecting und Selected analog, wenn eine Registerkarte aktiviert wird.
Deselecting und Selecting liefern dem Ereignishandler ein Objekt vom Typ TabControlCancelEventArgs und können über dessen Eigenschaft Cancel den eingeleiteten Vorgang abbrechen. Das haben wir schon bei anderen Ereignissen ähnlich gesehen, zum Beispiel beim Ereignis FormClosing der Form. Werden Deselected und Selected ausgelöst, ist der Vorgang bereits abgeschlossen. Hier ist es ein Objekt vom Typ TabControlEventArgs, das als ereignisspezifisches Objekt dient.
Bei beiden Args-Objekten können Sie über Eigenschaften den Index und die Referenz der betroffenen Registerkarte abfragen. Und weil dann noch ungeklärt ist, in welchem Ereignis sich alles abspielt, wird Ihnen über Action auch noch dafür eine Auswertung angeboten. Die Werte bezieht Action aus der Aufzählung TabControlAction.
Tabelle 19.13 Die Mitglieder der Enumeration »TabControlAction«
| Member
|
Beschreibung
|
| Deselected
|
Ursache ist das TabControl.Deselected-Ereignis.
|
| Deselecting
|
Ursache ist das TabControl.Deselecting-Ereignis.
|
| Selected
|
Ursache ist das TabControl.Selected-Ereignis.
|
| Selecting
|
Ursache ist das TabControl.Selecting-Ereignis.
|
Ein Ereignis sollte an dieser Stelle noch erwähnt werden, auch wenn es in der neuen Version von .NET Framework durch die eben beschriebenen neuen Ereignisse ersetzt worden ist. Es handelt sich um SelectedIndexChanged. Es wird bei der Änderung der Eigenschaft SelectedIndex ausgelöst und reiht sich damit in die Liste der Ereignisse ein, die direkt mit dem Wechsel einer Registerkarte in Zusammenhang stehen.
19.12.2 Objekte vom Typ »TabPage«  
Ein Objekt vom Typ TabPage beschreibt eine einzelne Registerkarte. Die Klasse hat nur wenige spezifische Eigenschaften. Zunächst wäre Text zu nennen, mit der die Beschriftung des Karteireiters festgelegt wird. Wenn Sie großen Wert auf Symbole legen, können Sie neben der Beschriftung der Registerkarte auch ein Bildchen anzeigen. Das setzt allerdings voraus, dass Sie der Form ein ImageList-Steuerelement hinzugefügt haben und dieses der gleichnamigen Eigenschaft des TabControl-Objekts bekannt geben. Welches Bild aus der Bilderliste in der Registerkarte angezeigt wird, ist der Eigenschaft ImageIndex anzugeben. Wollen Sie, dass eine Registerkarte einen QuickInfo-Text anzeigt, weisen Sie den gewünschten Text der Eigenschaft ToolTipText zu.
Steuerelemente in den Registerkarten
Die Gestaltung der Registerkarten ist denkbar einfach. In der Entwicklungsumgebung wählen Sie eine Registerkarte aus und können darin in bekannter Weise die Steuerelemente einfügen. Jede Registerkarte verwaltet die Steuerelemente in einer eigenen Auflistung vom Typ ControlCollection, deren Referenz die Eigenschaft Controls bereitstellt (siehe dazu auch Kapitel 15).
|